home *** CD-ROM | disk | FTP | other *** search
- /*
- NetWare Archive to Alloy - File List output Module
- V4.42 02/04/84 by Mark Hurst, Kyle Powell
-
- For use with NetWare V4.n systems
-
- Copyright (C) 1983, 1984 Novell, Inc.
- */
-
- #include "ctype.h"
- #include "stdio.h"
-
-
- #define LOCALBIT 0x80
- #define PERMNET 0x01
- #define TEMPNET 0x02
- #define NETBITS 0x03
-
- #define READBIT 0x01
- #define WRITEBIT 0x02
- #define OPENBIT 0x04
- #define CREATEBIT 0x08
- #define DELETEBIT 0x10
- #define OWNEDBIT 0x20
- #define SEARCHBIT 0x40
- #define MODIFYBIT 0x80
-
- /* NOTE: the Archive bit was 0x80 on ShareNet V3.12. Has now changed: */
- #define BACKUPBIT 0x20
- #define LASTBIT 0x10
-
- extern unsigned DOS11, DOS20;
- unsigned unitsize;
- unsigned fileswritten;
-
- #define VARPATH '^' - 'A'
-
- #define TRUE 1
- #define FALSE 0
-
- #define MAXVOLUMES 16
- #define MAXSPECS 100
-
- #define ALLMODE 1
- #define MODMODE 2
- #define SELMODE 3
-
-
- FILE *log;
- int source, target; /* low level I/O file numbers */
-
- extern char actarget[20];
- extern char inline[80];
-
- extern int printlog, spool, saverights;
- int nprinter, logcopies;
- extern int startup;
-
-
- extern int numberqualified, numberout;
- char *calloc(), *malloc();
-
- extern unsigned known, firsttypecheck, unusabledisk;
-
- typedef struct dosfcb {
- char drive;
- char fname[8];
- char fext[3];
- unsigned curblk;
- unsigned recsize;
- long size;
- unsigned date;
- char reserved[10];
- char relrec;
- char record[4];
- } FCB;
-
- typedef struct exdirfcb {
- char dummy;
- char exset;
- char res[5];
- char flags;
- char drive;
- char fname[8];
- char fext[3];
- char gap[17];
- char size[4];
- } ExDirFCB;
-
- typedef struct exdosfcb {
- char dummy;
- char exset;
- char res[5];
- char flags;
- char drive;
- char fname[8];
- char fext[3];
- unsigned curblk;
- unsigned recsize;
- long size;
- unsigned date;
- char reserved[10];
- char relrec;
- char record[4];
- } ExFCB;
-
- extern int BrkFlag;
-
- extern int mode, bdrive, firstcopy;
-
- extern char pathstring[256];
- extern char privmask;
-
- int _fmode = 0x8000;
-
- extern int listcount;
-
-
- typedef struct liststruct {
- struct liststruct *link;
- char name[12]; /* 1 too big for even allocation */
- char marked;
- char flags;
- long size; /* size of file in bytes */
- unsigned units; /* size of file in allocation units */
- } LISTNODE;
-
- #define LISTSIZE 250
- extern LISTNODE *list[LISTSIZE], *curnode;
-
- ExFCB sourcefile;
- ExFCB destfile;
-
-
-
- extern int curtrack,dstat,istat;
-
-
- struct fhead {
- char fflag;
- char fname[11];
- int boffset;
- int blklen;
- char data[1];
- };
-
- struct fcbstruct {
- char fcbdrive;
- char fcbname[11];
- int fblock;
- int recsize;
- unsigned fsizelow;
- unsigned fsizehigh;
- char reserved[12];
- char currec;
- };
-
-
- char *dirhead = " DIRECTORY ";
- char twork[8208] ={0};
-
-
- acheckbreak()
- {
- char ch;
- ChkKey();
- if (BrkFlag) {
- cprintf("\r\n\7");
- if (yes("Cancel Archive session? (Y/N) ")) {
- if (!fileswritten) {
- backmarks(1);
- backrecs(1);
- }
- marktape(); marktape();
- abort();
- }
- BrkFlag = 0;
- }
- }
-
-
-
- int imin();
- unsigned umin();
- long lmin();
-
-
- writelist()
- {
- char test[20],ch;
- int stat, reuse, i, proceed;
- unsigned u;
-
- if (!listcount) return;
-
- /* SORT FILE LIST IN ASCENDING SIZE */
- sortlist();
- unitsize = 8192;
- calcunits();
-
- dotape();
-
- cprintf("\r\n");
- }
-
-
- char btime[7];
-
- /*
- dotape() WILL WRITE FILES TO TAPE IN LARGEST TO SMALLEST ORDER,
- SKIPPING IF NECESSARY TO PACK SMALLER FILES AT END OF TAPE.
- */
- dotape()
- {
- char i;
- int writecount;
- unsigned ccode, splitting;
-
- cprintf(" Archiving: ");
-
- timedate(btime);
-
- onemoretime:
- while (logheader(btime)) {
- cprintf("\r\n\7Tape is full or otherwise unusable.\r\n");
- tapesetup();
- }
-
- writecount = 0;
- splitting = FALSE;
- fileswritten = FALSE;
-
- i = LISTSIZE;
- while (i--) {
- acheckbreak();
- if (list[i]) {
- if (list[i]->size == 0L) ccode = -1; /* IGNORE ZERO FILES */
- else if (list [i]->name [0] != 0x80) {
- if (splitting) {
- ccode = writefile(i, twork,&writecount,writecount);
- splitting = FALSE;
- }
- else {
- if (writecount && list[i]->units > writecount) continue;
- putch('*');
- ccode = writefile(i, twork, &writecount,0);
- }
- }
- else {putch ('+'); ccode = 0;} /* skip dummy rights entry */
-
- switch(ccode) {
- case -3: /* WRITE FAILURE */
- case -2: /* WRITE FAILURE */
- error ("FATAL ERROR: Error writing to tape.");
- marktape(); marktape(); /* WRITE EOT */
- myexit(0);
- break;
- case 0: /* FILE WAS WRITTEN OK; REMOVE FROM LIST AND GO ON */
- fileswritten = TRUE;
- case -1: /* UNABLE TO OPEN FILE, SKIPPED */
- free(list[i]);
- listcount--;
- list[i] = 0x0000;
- break;
- case 1:
- switch(split(i, writecount)) {
- case 1: /* FILE SKIPPED, CONTINUE TO NEXT */
- clrfile(&sourcefile.exset);
- if (!writecount) i=0; /* No more space */
- break;
- case 2: /* ADVANCE TO NEXT TAPE BEFORE GOING ON */
- i++; /* Do same file over again */
- if (!fileswritten) {
- backmarks(1);
- backrecs(1);
- }
- marktape(); marktape(); /* EOT */
- cprintf("\r\n");
- tapesetup();
- while (logheader(btime)) {
- cprintf("\7Tape is full or otherwise unusable.\r\n");
- tapesetup();
- }
- writecount = 0;
- fileswritten = FALSE;
- break;
- case 3: /* FILE WAS SPLIT, need to continue next seg */
- i++;
- cprintf("\r\n");
- tapesetup();
- while (logheader(btime)) {
- cprintf("\7Tape is full or otherwise unusable.\r\n");
- tapesetup();
- }
- splitting = TRUE;
- fileswritten = FALSE;
- slogentry(i-1);
- break;
- }
- }
- }
- }
- /* IF STILL HAVE FILES, THEN MUST ERASE HEADER */
- if (!fileswritten) {
- backmarks(1);
- backrecs(1);
- }
- if (listcount) {
- marktape(); marktape(); /* EOT */
- cprintf("\r\n");
- tapesetup();
- goto onemoretime;
- }
- else {
- marktape(); marktape();
- backmarks(2);
- }
- }
-
-
- split(fnum, writecount)
- unsigned fnum, writecount;
- {
- if (writecount > 32) return (3); /* SPLIT */
- else return (1); /* TRY NEXT FILES */
- }
-
-
- logheader(time)
- char *time;
- {
- char ttext[65], ccode;
-
- gentime(time, ttext);
- ccode = wdirhead(twork, pathstring, ttext);
- if (ccode) return (ccode);
-
- if (printlog) {
- printstr(" Files archived ");
- printstr(ttext);
- printstr("\r\n");
- }
-
- return (0);
- }
-
-
- unsigned smallest()
- {
- int i;
- unsigned u;
-
- i = 0;
- while ((list[i] == 0) && (i < LISTSIZE)) i++;
- if (i == LISTSIZE) return (0);
- else return (list[i]->units);
- }
-
- /* SORT list FROM SMALLEST SIZE TO LARGEST SIZE */
- sortlist()
- {
- int i, j, k;
- LISTNODE *transfer;
- long minimum;
-
- for(i=0; i < listcount; i++) {
- minimum = list[i]->size;
- k = i;
- for(j=i+1; j < listcount; j++) {
- if (list[j]->size < minimum) {
- k = j;
- minimum = list[j]->size;
- }
- }
- if (k != i) {
- transfer = list[k];
- list[k] = list[i];
- list[i] = transfer;
- }
- }
- }
-
- calcunits()
- {
- int i;
-
- i = LISTSIZE;
- while (i) {
- i--;
- if (list[i] == 0) continue;
- list[i]->units = (unsigned) ((list[i]->size +
- (long)(unitsize-1)) / (long) unitsize);
- }
- }
-
- /* CLEAR MARKS ON FILES SO THAT RE-EVALUATION CAN BE PERFORMED FROM SCRATCH */
- clearmarks()
- {
- unsigned i;
-
- for (i= 0; i < LISTSIZE; i++) {
- list[i]->marked = FALSE;
- }
- }
-
-
-
-
- setflags(fnum, setmask, clrmask)
- char setmask, clrmask;
- int fnum;
- {
- ExFCB search;
- ExDirFCB found;
-
- setmem(&search, sizeof(ExFCB), 0);
- search.exset = 0xFF;
- search.flags = 0x06;
- search.drive = VARPATH + 1;
- movmem(list[fnum]->name, search.fname, 11);
- setDTA(&found.exset);
- if (search1(&search.exset)) return; /* ERROR, forget it */
- found.gap[0] |= setmask;
- found.gap[0] &= ~clrmask;
- if (FileAtt(&found.exset, found.gap[0])) /* ERROR */ ;
- }
-
-
- dopensource(fnum)
- int fnum;
- {
- char ch, sourcename[20];
- int i, c, stat;
-
- setmem(&sourcefile, sizeof(ExFCB), 0);
- sourcefile.exset = 0xFF;
- sourcefile.flags = 0x06;
- sourcefile.drive = VARPATH + 1;
- movmem(list[fnum]->name, sourcefile.fname, 11);
- if (logfile(&sourcefile.drive)) {
- error("Network file list full.");
- myexit(0);
- }
- while (lockfset(0)) {
- cprintf("\r\nFile ");
- showfile(&sourcefile.drive);
- cprintf("is in use by another station. ");
- ch = 'x';
- while (ch != 'S' && ch != 'R') {
- cprintf("Skip or Retry? ");
- ch = getstr(inline, 5);
- if (ch == 3) {fclose(log); abort();}
- if (!ch) {ch = 'R'; cprintf("Retry");}
- ch = toupper(ch);
- cprintf("\r\n");
- }
- if (ch == 'S') {
- clrfile(&sourcefile.drive);
- inuselog(sourcefile.fname); /* make note in print log */
- return (FALSE);
- }
- }
-
- /* OPEN FILE FOR HIGH LEVEL BUFFERED I/O */
- stat = openfile(&sourcefile.exset);
- if (stat) return (FALSE); /* FILE WAS DELETED BEFORE I LOCKED IT */
- sourcefile.recsize = 1;
- return (TRUE);
- }
-
-
- lprint(string)
- char *string;
- {
- cprintf(string);
- if (printlog) printstr(string);
- }
-
- printstr(text)
- char *text;
- {
- while (*text) prnout(*text++);
- }
-
- prnline()
- {
- char line[80];
-
- setmem(line, 79, '=');
- line[79] = 0;
- printstr(line);
- printstr("\r\n");
- }
-
-
- sendbanner()
- {
- char spl[25], srb[100];
-
- spl[0] = 21;
- spl[1] = 0;
- spl[2] = 2;
- spl[3] = 0x80 | 0x40 | 0x20; /* Banner, Delete, Tabs */
- spl[4] = 8;
- spl[5] = nprinter;
- spl[6] = logcopies;
- spl[7] = 0;
- strcpy(&spl[8], "\3ARCHIVE LOG ");
- srb[0] = 98;
- srb[1] = 0;
- if (SpoolReq(spl, srb)) {
- cprintf("Error sending spooler flags -- log report cancelled.\r\n\7");
- printlog = FALSE;
- }
- }
-
- int countprinters()
- {
- char spl[30], srb[100];
- int p = 4;
-
- spl[0] = 2;
- spl[1] = 0;
- spl[2] = 6;
- spl[3] = p;
- srb[0] = 98;
- srb[1] = 0;
- while (SpoolReq(spl, srb) != 0 && p) {
- p--;
- spl[3]--;
- }
- return (p+1);
- }
-
-
- configlog()
- {
- char ans[10], ch;
- int pnum;
-
- printlog, spool = FALSE;
- if (!yes("Do you want to print a log report of this session? (Y/N) "))
- return;
- else printlog = TRUE;
-
- ans[0] = 'x';
- while (ans[0] != 'N' && ans[0] != 'L') {
- cprintf("Print to Local printer or Network spooler? (L/N) ");
- ch = getstr(ans, 7);
- if (ch == 3) abort();
- if (!ch) {ans[0] = 'N'; cprintf("Network");}
- cprintf("\r\n");
- conupper(ans);
- if (ans[0] == 'N') spool = TRUE;
- }
-
- if (!spool) {ploghead(); return;}
-
- /* request printer # and # of copies */
- pnum = countprinters();
- if (pnum > 1) {
- nprinter = 9;
- while (nprinter >= pnum || nprinter < 0) {
- cprintf("Select network printer: (0 - %d) ",pnum-1);
- getstr(ans, 1);
- if (ans[0] == 3) abort();
- if (!ans[0]) {ans[0] = '0'; cprintf("0");}
- cprintf("\r\n");
- nprinter = ans[0] - '0';
- }
- }
- else nprinter = 0; /* only one printer, so don't ask */
-
- logcopies = 10;
- while (logcopies < 1 || logcopies > 9) {
- cprintf("Number of copies: (1-9) ");
- getstr(ans, 1);
- if (ans[0] == 3) abort();
- if (!ans[0]) {ans[0] = '1'; cprintf("1");}
- cprintf("\r\n");
- logcopies = ans[0] - '0';
- }
-
- /* START PRINT MODE */
- modLST(0);
- sendbanner();
- ploghead();
- }
-
- ploghead()
- {
- char t[7], buff[80];
- timedate(t); /* get system time */
- gentime(t, buff);
- if (!spool) printstr("\14"); /* form feed */
- prnline();
- printstr("Archive Log Report for session started ");
- printstr(buff);
- printstr("\r\nAny files listed below were archived to ");
- printstr("the backup tape.\r\n");
- prnline();
- printstr("\r\n");
- }
-
- tapehead(aflag)
- int aflag;
- {
- if (!printlog) return;
- prnline();
- if (aflag)
- printstr("APPENDING TO A TAPE\r\n");
- else printstr("BEGINNING A NEW TAPE\r\n");
- prnline();
- printstr("\r\n\r\n");
- }
-
-
- logentry(fnum)
- int fnum;
- {
- char orig[20], out[80];
- int ix = 0;
-
- movmem(list[fnum]->name, orig, 11);
- orig[11] = 0;
- ix += sprintf(out, " %11s %3s", orig, &actarget[8]);
-
- orig[0] = orig[1] = 0x20;
- orig[2] = 0;
- if (list [fnum]->flags) sprintf (orig, "%2x", list [fnum]->flags);
-
- sprintf(&out[ix], "%2s \15\12", orig);
- if (printlog) printstr(out);
- }
-
- skiplog(name)
- char *name;
- {
- char temp[20];
-
- movmem(name, temp, 11);
- temp[11] = 0;
- if (!printlog) return;
- printstr("> ");
- printstr(temp);
- printstr(" NOT archived. Skipped to avoid file splitting.\r\n");
- }
-
- inuselog(name)
- char *name;
- {
- char temp[20];
-
- movmem(name, temp, 11);
- temp[11] = 0;
- if (!printlog) return;
- printstr("> ");
- printstr(name);
- printstr(" NOT archived. File was in use by another station.\r\n");
- }
-
-
- slogentry(fnum)
- int fnum;
- {
- char orig[20], out[80];
- int ix = 0;
-
- if (!printlog) return;
-
- movmem(list[fnum]->name, orig, 11);
- orig[11] = 0;
- ix += sprintf(out, "* %11s %3s", orig, &actarget[8]);
-
- orig[0] = orig[1] = 0x20;
- orig[2] = 0;
- if (list [fnum]->flags) sprintf (orig, "%2x", list [fnum]->flags);
-
- sprintf(&out[ix], "%2s\15\12", orig);
- printstr(out);
- }
-
-
- static char *daytab[] = {
- "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
-
- static char *monthtab[] = {
- "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
-
-
- gentime(in, out)
- char *in, *out;
- {
- int hour, ix = 0;
- char year[4];
-
- ix = sprintf(out, "%9s, ",daytab[in[6]]); /* day of week */
- ix += sprintf(&out[ix], "%3s %2d, ", monthtab[in[1]-1],in[2]);
- sprintf(year, "%2d", in[0]);
- if (in[0] < 10) year[0] = '0';
- if (in[0] < 82) ix += sprintf(&out[ix], "20%2s ", year);
- else ix += sprintf(&out[ix], "19%2s ", year);
-
- hour = in[3];
- if (hour > 12) hour -= 12;
- if (!hour) hour = 12;
- ix += sprintf(&out[ix], "%2d:", hour);
- if (in[4] < 10)
- ix += sprintf(&out[ix], "0%1d ", in[4]);
- else ix += sprintf(&out[ix], "%2d ", in[4]);
- if (in[3] >= 12) sprintf(&out[ix], "pm");
- else sprintf(&out[ix], "am");
- }
-
-
-
- int wdirhead(buff,dir,date)
- char *buff,*dir,*date;
- {
- char *s1,*s2;
- int i;
-
- s1 = dirhead;
- s2 = buff;
- while (*s1) *s2++ = *s1++;
- s1 = date;
- for (i=0;i<64;i++) {
- if (*s1) *s2++ = *s1++;
- else *s2++ = 0;
- }
- s1 = dir;
- while (*s1) *s2++ = *s1++;
- *s2++ = 0;
-
- if (saverights) {
- CopyTrustees (s2);
- if (printlog) printstr ("(Directory rights and trustee lists saved)\r\n");
- }
- else *s2++ = 0; /* put in first byte to indicate NO stuff saved */
-
- marktape();
- eotcheck:
- if (dstat & 4) {
- marktape();
- if (curtrack != 3) {
- seltrack(curtrack+1);
- rewindtape();
- marktape();
- }
- else {
- cprintf("\r\n");
- tapesetup();
- marktape();
- }
- }
- if (writetape(buff)) return (-1);
- if (writestat()) {
- if (((istat & 0x30) == 0x10) && (dstat &4)) goto eotcheck;
- return (-1);
- }
- return (marktape());
- }
-
-
- int writefile(fnum,buff,bcnt,soffset)
- unsigned fnum;
- struct fhead *buff;
- unsigned *bcnt;
- unsigned soffset;
- {
- char *s1,*s2;
- struct fcbstruct *fcb;
- int numblks,lastlen,i;
-
- if (list [fnum]->name [0] == 0x80) {numberout++; return (0);}
-
- s1=list[fnum]->name;
- s2=buff->fname;
- for (i=0;i<11;i++) *s2++ = *s1++;
- buff->fflag = list[fnum]->flags;
- buff->boffset = buff->blklen = 0;
-
- if (!dopensource(fnum)) return(-1);
-
- fcb = (struct fcbstruct *) &sourcefile.drive;
-
- lastlen = fcb->fsizelow & 0x1fff;
- numblks = (fcb->fsizelow >> 13) | (fcb->fsizehigh << 3);
- if (lastlen) numblks++;
- fcb->fblock = 0;
- fcb->recsize = 8192;
- fcb->currec = 0;
- SetDTA(buff->data);
- if (soffset) {
- numblks -= soffset;
- fcb->currec = soffset & 0x7f;
- fcb->fblock = soffset >> 7;
- buff->boffset = soffset;
- }
- SeqRead(fcb);
- while (numblks--) {
- if (numblks==0) {
- buff->blklen = lastlen;
- buff->fflag |= LASTBIT;
- }
- if (dstat & 4) { /* EOT */
- marktape();
- marktape();
- if (curtrack != 3) {
- seltrack(curtrack +1);
- rewindtape();
- }
- else {
- *bcnt= buff->boffset;
- if (backmarks(2)) {cp ('A');return(-2);}
- if (*bcnt) {
- if (backrecs(*bcnt)) {cp('B');return(-2);}
- }
- return(1);
- }
- }
- if (writetape(buff)) {cp ('C');return (-2);}
- SeqRead(fcb);
- buff->boffset++;
- if (writestat()) {
- if (((istat & 0x30) == 0x10) && (dstat & 4)) { /*EOT*/
- buff->boffset--;
- numblks++;
- fcb->currec=buff->boffset & 0x7f;
- fcb->fblock=buff->boffset >> 7;
- SeqRead(fcb);
- }
- else {cp ('D'); return(-3);}
- } else buff->fflag=0;
- }
-
- setflags(fnum, 0, BACKUPBIT); /* clear bit, indicating backed up */
- clrfile(&sourcefile.exset);
-
- numberout++;
-
- logentry(fnum);
-
- return (0);
- }
-
- tapesetup()
- {
- char ch;
-
- newtape:
- cprintf("1 tapesetup\n\r");
- resettape();
- cprintf("2 tapesetup\n\r");
- rewindtape();
- cprintf("3 tapesetup\n\r");
- cprintf(
- "Prepare the backup tape in the Alloy unit and press any key to continue.\7\r\n");
- ch = getch();
- if (ch == 0x03) myexit();
-
- resettape();
- rewindtape();
-
- /* CHECK WRITE PROTECT */
- if (!(dstat & 1)) {
- cprintf("\7This tape is write-protected.\r\n");
- goto newtape;
- }
-
- if (yes("Do you want to append to the end of this tape? (Y/N) ")) {
- cprintf("Searching for the end of the tape.\r\n");
- if (findEOT(twork)) {
- cprintf("\7Unable to find End-of-tape mark.\r\n");
- goto newtape;
- }
- else tapehead(TRUE);
- }
- else {
- cprintf("This will destroy any data on the tape.\r\n");
- if (!yes("Do you wish to continue? (Y/N) ")) goto newtape;
- cprintf("Initializing tape -- please wait.\r\n");
- if (inittape(twork)) {
- cprintf("\7Unable to initialize tape.\r\n");
- goto newtape;
- }
- else tapehead(FALSE);
- }
- }
-
- cp (letter)
- char letter;
- {
- cprintf ("Check point %c\7\7\7\r\n", letter);
- }